package Aplicacion;


import java.util.Date;
import java.util.ArrayList;

import Utils.Utils;

import Estados.InvalidadaState;
import Estados.NormalState;
import Estados.PagadaState;
import Estados.PerdonadaState;
import Estados.State;
import Estados.VencidaState;

public class Infraccion {
	
	public String nombre = "INFRACCION";
	public static final int MAXYEARS = 4;
	private TipoInfraccion tipo ;
	private ArrayList<String> mails;
	private ArrayList<String> nrosCel; 
	private Date fecha;
	private State estado;
	private Zona zona;


	public Infraccion(TipoInfraccion tipo, Date fecha, Zona zona){
		this.setTipo(tipo);
		this.fecha = fecha;
		this.mails = new ArrayList<String>();
		this.nrosCel = new ArrayList<String>();
		this.zona = zona;
		this.nombre  = tipo.getTipo();
		this.estado = new NormalState();
	}
	
	/* getters delegados al estado del objeto */
	
	public double getCosto(){
		return this.getEstado().getCosto(this);
	}
	
	public int getPuntos(){
		return this.getEstado().getPuntos(this);
	}
	
	public int getCount() {
		return this.getEstado().getCount(this);
	}
	
	/* Estados */	
	
	public void setInvalidada() {
		this.setEstado(new InvalidadaState());
	}
	
	public void setPerdonada() {
		this.setEstado(new PerdonadaState());
	}
	
	public void setPagada() {
		this.setEstado(new PagadaState());
	}
	
	public void setVencida() {
		this.setEstado(new VencidaState());
	}		

	private void setEstado(State estado) {
		this.estado = estado;
	}
	
	private State getEstado() {
		return this.estado;
	}	
	
	public boolean estaInvalidada() {
		return this.getEstado().estaInvalidada();
	}	
	
	/* Chequeos por cambios de estado */
	
	public void chequearVencimiento() {
		if (Utils.isOlderThanYears(this.getFecha(), Infraccion.MAXYEARS)) {
			this.setVencida();
		}
	}
	
	public void chequearPago(ArrayList<Infraccion> infraccionesPagadas) {
		if (infraccionesPagadas.contains(this)) {
			this.setPagada();
		}
	}
	
	public void chequearPerdonada(Infraccion lastInfraccion) {			
		if (lastInfraccion != null && Utils.isOlderThanYears(lastInfraccion.getFecha(), Vehiculo.ANIOSPERDONADA)) {
			this.setPerdonada();
		}
	}	
		
	/* mails y nros */
		
	public void agregarMail(String mail){
		this.mails.add(mail);
	}
	
	public void agregarNroCel(String nroCel){
		this.nrosCel.add(nroCel);
	}
	
	public ArrayList<String> getMails(){
		return this.mails;
	}
	
	public ArrayList<String> getNrosCel(){
		return this.nrosCel;
	}
	
	/* getters and setters comunes */
	
	public double _getCosto(){
		return this.tipo.getCosto();
	}
	
	public int _getPuntos(){
		return this.tipo.getPuntos();
	}
	
	public int _getCount(){
		return 1;
	}
	
	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}
	
	public TipoInfraccion getTipo() {
		return this.tipo;
	}

	public void setTipo(TipoInfraccion tipo) {
		this.tipo=tipo;
	}
	
	public Zona getZona(){
		return this.zona;
	}

	public void procesarAcumulador(Acumulador acumulador) {
		acumulador.sumarPuntos(this.getPuntos());
		acumulador.sumarCosto(this.getCosto());
		acumulador.sumarCantidad(this.getCount());
	}		
}
